perm filename GUNFAI.FAI[SYS,HE]1 blob sn#050014 filedate 1973-06-19 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00017 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		FAISUM
C00004 00003		FAISUM CONT.
C00006 00004		SUMINT
C00007 00005		ANGDIR, ANGLE
C00008 00006		SORINT
C00009 00007		SORLOD
C00010 00008		SORBOD
C00012 00009		SORBOD CONT.
C00014 00010		SORBOD	CONT.
C00016 00011		SORBOD CONT.
C00018 00012		SORBOD CONT., ANGLEN, LDIST
C00020 00013		DNEW, MALI
C00022 00014		WEIFAI
C00023 00015		LININT
C00024 00016		PLDIS
C00026 00017		PLDIS CONT.
C00027 ENDMK
C⊗;
;	FAISUM
ENTRY FAISUM,SUMINT,ANGDIR,ANGLE,SORINT,SORLOD,SORBOD,ANGLEN
ENTRY LININT,DNEW,WEIFAI,MALI,LDIST,PLDIS

	TITLE	GUNFAI - FAIL CODE FOR SPEEDING UP GUNLO
P←17;
SAV:	BLOCK 20	;SAVE REGISTERS HERE AS NECESSARY

;FOR SUMS PROCEDURE

EXTERNAL IHI,IHI2,SX,SY,SX2,SY2,SXY,LEKV

E11←0
E21←1
E12←2
E22←3
H←4
H1←5
H2←6
L←7

FAISUM:	MOVE	[XWD 12,SAV]
	BLT	SAV+3
	MOVE	H,IHI		;LOAD REGISTERS WITH POINTERS
	MOVE	H1,-6(P)
	MOVE 	L,-7(P)
	MOVE	H2,IHI2
L100:	
EAX1:	MOVE	E11,.(H)	;LOAD COORDINATES - ADDRS SET BY SUMINT
EBX1:	MOVE	E21,.(H)
EAY1:	MOVE	E12,.(H)
EBY1:	MOVE	E22,.(H)
	MOVE	10,E11		;CALCULATE NEXT SET OF VALUES
	FADR	10,E21		;X1+X2
	MOVE	11,E12
	FADR	11,E22		;Y1+Y2
	MOVE	12,E11
	FMPR	12,E11
	MOVE	13,E21
	FMPR	13,E21
	FADR	12,13		;X1↑2+X2↑2
	MOVE	13,E12
	FMPR	13,E12
	MOVE	14,E22
	FMPR	14,E22
	FADR	13,14		;Y1↑2+Y2↑2
	MOVE	14,E12
	FMPR	14,E11
	MOVE	15,E21
	FMPR	15,E22
	FADR	14,15		;X1*X2+Y1*Y2
;	FAISUM CONT.

	CAME	H,L
	JRST	L1
	MOVEM 	10,SX		;FIRST TIME THROUGH-STORE VALUES
	MOVEM	11,SY
	MOVEM 	12,SX2
	MOVEM	13,SY2
	MOVEM	14,SXY
	JUMPL	H1,L101		;MORE POINTS - CONTINUE
	MOVE	10,[XWD SAV,12]
	BLT	10,15
	PUSH	P,E11		;OTHERWISE, GET COEFS. AND RETURN
	PUSH	P,E12
	PUSH	P,E21
	PUSH	P,E22
	PUSH	P,-11(P)	;ADDRS FOR COEFS. BACK ON STACK
	PUSH	P,-11(P)
	PUSH	P,-11(P)
	MOVEM	H,IHI		;THIS MAY HAVE BEEN CHANGED
	PUSHJ	P,LEKV
	SETZM	1		;FLAG FOR IMMEDIATE EXIT
	POPJ	P,

L101:	CAMN	H,H2
	JRST	L11		;WE ARE DONE
	AOJA	H,L100		;OTHERWISE, INC POINTER AND RETURN FOR MORE

L1:	FADRM	10,SX		;THIS WAS NOT FIRST PAIR, ADD VALUES TO SUMS
	FADRM	11,SY
	FADRM	12,SX2
	FADRM	13,SY2
	FADRM	14,SXY
	JUMPL	H1,L101		;RETURN FOR MORE POINTS
L11:	MOVEM	H,IHI		;DONE - EXIT
	MOVE	10,[XWD SAV,12]
	BLT	10,15
	SETOM	1		;NO IMMEDIATE RETURN
	POPJ	P,
;	SUMINT

SUMINT:	MOVE	-5(P)
	HRRM	EAX2
	HRRM	EAX3
	HRRM	EAX4
	HRRM	EAX5
	HRRM	EAX6
	SOS
	HRRM	EAX1
	MOVE	-4(P)
	HRRM	EAY2
	HRRM	EAY3
	HRRM	EAY4
	HRRM	EAY5
	HRRM	EAY6
	SOS
	HRRM	EAY1
	MOVE	-3(P)
	HRRM	EBX2
	HRRM	EBX3
;	HRRM	EBX4
	HRRM	EBX5
	HRRM	EBX6
	HRRM	EBX7
	HRRM	EBX8
	HRRM	EBX9
	SOS
	HRRM	EBX1
	MOVE	-2(P)
	HRRM	EBY2
	HRRM	EBY3
;	HRRM	EBY4
	HRRM	EBY5
	HRRM	EBY6
	HRRM	EBY7
	HRRM	EBY8
	HRRM	EBY9
	HRRM	EBY10
	HRRM	EBY11
	SOS
	HRRM	EBY1
	MOVE	-1(P)
	HRRM 	LE1
	HRRM 	LE2
	HRRM 	LE3
	HRRM 	LE4
	HRRM 	LE5
	HRRM 	LE6
	HRRM	LE7
	SUB	P,[XWD 6,6]
	JRST	@6(P)
;	ANGDIR, ANGLE

EXTERNAL ATAN2,AMOD


ANGDIR:	PUSH	P,-1(P)
	PUSH	P,-3(P)
	PUSHJ	P,ATAN2
	FADR	1,[6.2832]
	PUSH	P,1
	PUSH	P,[6.2832]
	PUSHJ	P,AMOD
	FMPR	1,[57.29]
	CAML	1,[360.0]
	SETZM	1
	SUB	P,[XWD 3,3]
	JRST	@3(P)

ANGLE:	POP	P,RET#		;SAVE RETURN ADDR
	PUSHJ	P,ANGDIR	;ARG ALREADY THERE - WILL REDUCE STACK BY 2
	MOVEM	1,TMP#		;SAVE RESULT
	PUSHJ	P,ANGDIR	;ARG THERE AGAIN - REDUCE STACK BY 2 MORE
	MOVNS	1
	FADR	1,TMP		;COMBINE
	FADR	1,[360.0]
	PUSH	P,1
	PUSH	P,[360.0]
	PUSH	P,RET		;PUT RETURN BACK ON STACK
	JRST	AMOD		;AMOD WILL RETURN FOR US
;	SORINT

SORINT:	MOVE	-6(P)
	HRRM	FAX1
	HRRM	FAX2
	HRRM	FAX3
	HRRM	FAX4
	HRRM	FAX5
	HRRM	FAX6
	MOVE	-5(P)
	HRRM	FAY1
	HRRM	FAY2
	HRRM	FAY3
	HRRM	FAY4
	HRRM	FAY5
	HRRM	FAY6
	MOVE	-4(P)
	HRRM	FBX1
	HRRM	FBX2
	HRRM	FBX3
	HRRM	FBX4
	HRRM	FBX5
	HRRM	FBX6
	MOVE	-3(P)
	HRRM	FBY1
	HRRM	FBY2
	HRRM	FBY3
	HRRM	FBY4
	HRRM	FBY5
	HRRM	FBY6
	MOVE	-2(P)
	HRRM	IFO1
	HRRM	IFO2
	HRRM	IFO3
	HRRM	IFO4
	HRRM	IFO5
	HRRM	IFO6
	HRRM	IFO7
	HRRM	IFO8
	HRRM	IFO9
	MOVE 	-1(P)
	HRRM	IBA1
	HRRM	IBA2
	HRRM	IBA3
	HRRM	IBA4
	HRRM	IBA5
	HRRM	IBA6
	HRRM	IBA7
	HRRM	IBA8
	SUB	P,[XWD 7,7]
	JRST	@7(P)
;	SORLOD

EXTERNAL NOEPA


; FOR SORTED - SORINT, SORLOD, SORBOD

SORLOD:	SETZM	1
	CAML	1,NOEPA
	POPJ	P,
LE1:	SETZM	.(1)
FAX1:	MOVE	2,.(1)
FBX1:	FADR	2,.(1)
	FSC	2,-1
EAX2:	MOVEM	2,.(1)
FAY1:	MOVE	2,.(1)
FBY1:	FADR	2,.(1)
	FSC	2,-1
EAY2:	MOVEM	2,.(1)
	MOVE	2,[1000000.]
EBX2:	MOVEM	2,.(1)
EBY2:	MOVEM	2,.(1)
IFO8:	SETOM	.(1)
IBA8:	SETOM	.(1)
	AOJA	1,SORLOD+1

X←0
Y←1
IP←1
DX0←2
DY0←3
DXN←4
DYN←5
DX1←6
DY1←7
DXY1←10
DXY2←11
D2←12
NEXT←13
IW←14
T←15
U←16

GRAV:	0
RDEP2:	0
DDQ:	0
FAK:	0
A1:	0
A2:	0
;	SORBOD


SORBOD:	HRLI	1,-6(P)
	HRRI	1,GRAV
	BLT	1,A2		;GET ARGUMENTS
	SUB	P,[XWD 7,7]
	MOVE	[XWD 12,SAV]
	BLT	SAV+4
	SOS	NOEPA		;REDUCE NOEPA BY ONE FOR TESTING
	SETZM	IW
LP1:	CAML	IW,NOEPA
	JRST	LP1END
EAX3:	MOVE	X,.(IW)		;GET CENTER POINT AND PAIR-VECTOR
EAY3:	MOVE	Y,.(IW)
FBX2:	MOVE	DX0,.(IW)
FAX2:	FSBR	DX0,.(IW)
FBY2:	MOVE	DY0,.(IW)
FAY2:	FSBR	DY0,.(IW)
	MOVEI	NEXT,1(IW)
LP100:	CAMLE	NEXT,NOEPA
	AOJA	IW,LP1
	MOVE	T,X		;IS NEW PAIR INSIDE WINDOW?
EAX4:	FSBR	T,.(NEXT)
	MOVMS	T
	CAMLE	T,GRAV
	AOJA	NEXT,LP100
	MOVE	T,Y
EAY4:	FSBR	T,.(NEXT)
	MOVMS	T
	CAMLE	T,GRAV
	AOJA	NEXT,LP100
FBX3:	MOVE	DXN,.(NEXT)	;YES - COMPUTE DIRECTED DISTANCES AND UPDATE
FAX3:	FSBR	DXN,.(NEXT)	;  MINIMA.  FIRST FIND VECTOR FOR NEW PAIR
FBY3:	MOVE	DYN,.(NEXT)
FAY3:	FSBR	DYN,.(NEXT)
FBX4:	MOVE	DX1,.(IW)
FAX4:	FSBR	DX1,.(NEXT)
	FMPR	DX1,[3.0]
FBX5:	FADR	DX1,.(NEXT)
FAX5:	FSBR	DX1,.(IW)
FBY4:	MOVE	DY1,.(IW)
FAY4:	FSBR	DY1,.(NEXT)
	FMPR	DY1,[3.0]
FBY5:	FADR	DY1,.(NEXT)
FAY5:	FSBR	DY1,.(IW)
	MOVE	DXY1,DX1
	FMPR	DXY1,DXY1
;	SORBOD CONT.

	MOVE	T,DY1
	FMPR	T,T
	FADR	DXY1,T		;DXY1←DX1↑2+DY1↑2
	MOVE	DXY2,DX0
	FADR	DXY2,DXN
	FMPR	DXY2,[-4.0]
	FADR	DXY2,DX1
	FMPR	DXY2,DXY2
	MOVE	T,DY0
	FADR	T,DYN
	FMPR	T,[-4.0]
	FADR	T,DY1
	FMPR	T,T
	FADR	DXY2,T		;DXY2←(DX1-4*(DX0+DXN))↑2+(DY1-4*(DY0+DYN))↑2
	CAMLE	DXY1,DDQ	;DIRECTED DISTANCES TOO LARGE?
	CAMG	DXY2,DDQ
	CAIA
	AOJA	NEXT,LP100
	MOVE	T,DX0
	FADR	T,DXN
	FMPR	T,T
	MOVE	U,DY0
	FADR	U,DYN
	FMPR	U,U
	FADR	T,U
	FMPR	T,T
	FSBR	T,A2		;D2←1 MAX (A1/(.001 MAX (((DX0+DXN)↑2+
	CAMGE	T,[0.001]	;(DYO+DYN)↑2)↑2-A2)))
	MOVE	T,[0.001]
	MOVE	D2,A1
	FDVR	D2,T
	CAMGE	D2,[1.0]
	MOVE	D2,[1.0]
	FMPR	D2,D2
	FSBR	D2,[1.0]
	FMPR	D2,FAK
	FMPR	D2,RDEP2	;D2←RDEP2*FAK*(D2↑2-1)
	FADR	DXY1,D2
	FADR	DXY2,D2
	CAMLE	DXY1,DDQ	;GO THROUGH MINIMUM VALUES AND UPDATE IF NEC.
	JRST	L101P
EBY5:	CAMLE	DXY1,.(IW)
	JRST	L102P
IFO1:	MOVEM	NEXT,.(IW)	;NEW MINIMUM FOR OLD FORWARD
EBY6:	MOVEM	DXY1,.(IW)
L102P:	
EBX5:	CAMLE	DXY1,.(NEXT)
	JRST	L101P
;	SORBOD	CONT.

IBA1:	MOVEM	IW,.(NEXT)	;NEW MINIMUM FOR NEW BACKWARD
EBX6:	MOVEM	DXY1,.(NEXT)
L101P:	CAMLE	DXY2,DDQ
	AOJA	NEXT,LP100
EBY7:	CAMLE	DXY2,.(NEXT)
	JRST	L103P
IFO2:	MOVEM	IW,.(NEXT)	;NEW MINIMUM FOR NEW FORWARD
EBY8:	MOVEM	DXY2,.(NEXT)
L103P:
EBX7:	CAMLE	DXY2,.(IW)
	AOJA	NEXT,LP100
IBA2:	MOVEM	NEXT,.(IW)	;NEW MINIMUM FOR OLD BACKWARD
EBX8:	MOVEM	DXY2,.(IW)
	AOJA	NEXT,LP100
	AOJA	IW,LP1

; AT THIS POINT, ALL EDGE-PAIRS HAVE BEEN EQUIPPED WITH BOTH
; BACKWARD AND FORWARD POINTERS (NOT NECESSARILY RECIPROCATED.)
; CLEAN UP THE LINKAGES, AND BREAK UP LOOPS (ALTHOUGH VERY
; UNLIKELY) AT THEIR WEAKEST LINK

I8←2
WEAK←3
IWEAK←4
ONE←5
TWO←ONE+1

LP1END:	SETZM	I8
	MOVEI	ONE,1
LP8:	CAMLE	I8,NOEPA	;REMEMBER, STILL DEC BY ONE
	JRST	LP8END
LE7:	SKIPE	.(I8)
	AOJA	I8,LP8
	SETZM	WEAK
	MOVEI	IW,(I8)
L82:	
LE2:	MOVEM	ONE,.(IW)
IFO3:	MOVE	NEXT,.(IW)
	JUMPL	NEXT,L80+1	;CHAIN CONTINUES?
IBA3:	CAME	IW,.(NEXT)
	JRST	L80
EBY9:	CAML	WEAK,.(IW)	;YES, STEP NEXT
	JRST	L84
	MOVEI	IWEAK,(IW)	;NEW MAXIMUM FOR WEAK LINK
EBY10:	MOVE	WEAK,.(IW)
L84:	MOVEI	IW,(NEXT)
	CAIE	IW,(I8)		;DO WE HAVE A LOOP?
	JRST	L82
;	SORBOD CONT.

IFO4:	MOVE	T,.(IWEAK)	;YES, BREAK AT WEAKEST LINK
IBA4:	SETOM	.(T)
IFO5:	SETOM	.(IWEAK)
	AOJA	I8,LP8
L80:
IFO6:	SETOM	.(IW)		;NO, THERE IS A BREAK, REVERSE
	MOVEI	IW,(I8)
L81:
IBA5:	MOVE	NEXT,.(IW)
	JUMPL	NEXT,L83+1	;CHAIN CONTINUES?
IFO7:	CAME	IW,.(NEXT)
	JRST	L83
	MOVEI	IW,(NEXT)	;YES, STEP NEXT
LE3:	MOVEM	ONE,.(IW)
	JRST	L81

L83:
IBA6:	SETOM	.(IW)		;BREAK IN THE BACKWARD LINKAGE-END OF CHAIN
	AOJA	I8,LP8

; THE FOLLOWING RECOPIES ARRAYS ACCORDING TO CONNECTIVITY

LP8END:	SETZM	IP
	MOVEI	TWO,2
	SETZM	IW
LP5:	CAMLE	IW,NOEPA
	JRST	LP5END
IBA7:	SKIPL	.(IW)
	AOJA	IW,LP5
	MOVEI	NEXT,(IW)
LE4:	MOVEM	ONE,.(IP)
L7:
FAX6:	MOVE	T,.(NEXT)
EAX5:	MOVEM	T,.(IP)
FAY6:	MOVE	T,.(NEXT)
EAY5:	MOVEM	T,.(IP)
FBX6:	MOVE	T,.(NEXT)
EBX9:	MOVEM	T,.(IP)
FBY6:	MOVE	T,.(NEXT)
EBY11:	MOVEM	T,.(IP)
IFO9:	MOVE	NEXT,.(NEXT)
	JUMPL	NEXT,[AOS IP
		      AOJA IW,LP5]
LE5:	ADDM	TWO,.(IP)
	AOS	IP
LE6:	MOVEM	TWO,.(IP)
	JRST	L7
;	SORBOD CONT., ANGLEN, LDIST

LP5END:	AOS	NOEPA		;PUT BACK NOEPA
	MOVE	[XWD SAV,12]
	BLT	16
	JRST	@7(P)

; COMPUTES ANGLE AND LENGTH FOR LINE LL

EXTERNAL SQRT

ANGLEN:	MOVE	6,-1(P)		;LL
	MOVEM	6,LL
	MOVEI	3,(6)
	ASH	3,1		;IV2
	MOVEI 	2,-1(3)		;IV2-1
XLC1:	MOVE	4,.(3)
XLC2:	FSBR	4,.(2)		;DX←XLCOR[IV2]-XLCOR[IV2-1]
YLC1:	MOVE	5,.(3)
YLC2:	FSBR	5,.(2)		;DY←YLCOR[IV2]-YLCOR[IV2-1]
	PUSH	P,4
	PUSH 	P,5
	FMPR	4,4
	FMPR	5,5
	FADR	4,5
	PUSH	P,4
	PUSHJ	P,SQRT
	MOVE	6,LL
RLN1:	MOVEM	1,.(6)		;RLEN[LL]←SQRT(DX↑2+DY↑2)
	PUSHJ	P,ANGDIR
	MOVE	6,LL
ANG1:	MOVEM	1,.(6)		;ANGARG[LL]←ANGDIR(DX,DY)
	SUB	P,[XWD 2,2]
	JRST	@2(P)

;	Measures distance (signed) from (X,Y) to line L.

LDIST:	MOVE	2,-1(P)
CXL3:	MOVE	1,.(2)
	FMPR	1,-3(P)
CYL3:	MOVE	3,.(2)
	FMPR	3,-2(P)
CCL3:	FADR	1,.(2)
	FADR	1,3
	SUB	P,[XWD 4,4]
	JRST	@4(P)
;	DNEW, MALI

;COMPUTES MEAN DISTANCE FROM PROJECTED LINE TO NEW POINT-PAIR

DNEW:	SOS	2,-4(P)
EAX6:	MOVE	1,.(2)
	FMPR	1,-3(P)
EAY6:	MOVE	3,.(2)
	FMPR	3,-2(P)
	FADR	1,3
	FADR	1,-1(P)
	MOVMS	1
EBX3:	MOVE	3,.(2)
	FMPR	3,-3(P)
EBY3:	MOVE	4,.(2)
	FMPR	4,-2(P)
	FADR	3,4
	FADR	3,-1(P)
	MOVMS	3
	FADR	1,3
	FSC	1,-1
	SUB	P,[XWD 5,5]
	JRST	@5(P)

; FINDS EQUATION AND OTHER INFORMATION FOR INSERTED LINE LL

MALI:	HRLZI	6,-5(P)
	BLT	6,4
	MOVE	5,
	LSH	5,1		;IV2
	MOVEI	6,-1(5)		;IV2-1
XLC4:	MOVEM	1,(6)
YLC4:	MOVEM	2,(6)
XLC5:	MOVEM	3,(5)
YLC5:	MOVEM	4,(5)
	POP	P,RET
	MOVE	5,
CXL2:	MOVEI	1,.(5)
	PUSH	P,1
CYL2:	MOVEI	1,.(5)
	PUSH	P,1
CCL2:	MOVEI	1,.(5)
	PUSH	P,1
	PUSHJ	P,LEKV
	PUSH	P,RET
	JRST	ANGLEN
;	WEIFAI

;PART OF WEIGHV PROCEDURE

EXTERNAL W, CX, CY, CL

WEIFAI:	MOVE	1,-1(P)
	AOS	1
	LSH	1,-1		;LL←(ISV+1)%2
	MOVEM	1,LL#
RLN2:	PUSH	P,.(1)
	PUSHJ	P,SQRT
	MOVEM	1,W		;W ← SQRT(RLEN[LL])
	MOVE	1,LL
CXL1:	MOVE	.(1)
	MOVEM	CX
CYL1:	MOVE	.(1)
	MOVEM	CY
CCL1:	MOVE	.(1)
	MOVEM	CL
	MOVE	1,-1(P)
XLC3:	MOVE	.(1)
	FMPR	W
	FADRM	SX
YLC3:	MOVE	.(1)
	FMPR	W
	FADRM	SY
	SUB	P,[XWD 2,2]
	JRST	@2(P)
;	LININT

;INITIALIZE ARRAY ADDRESS FOR LINE-VERTEX STRUCTURE

LININT:	SOS	1,-7(P)		;MAKE ALL ADDRESS RELATIVE TO INDEX 0
	HRRM	1,CXL1
	HRRM	1,CXL2
	HRRM	1,CXL3
	HRRM	1,CXL4
	SOS	1,-6(P)
	HRRM	1,CYL1
	HRRM	1,CYL2
	HRRM	1,CYL3
	HRRM	1,CYL4
	SOS	1,-5(P)
	HRRM	1,CCL1
	HRRM	1,CCL2
	HRRM	1,CCL3
	SOS	1,-4(P)
	HRRM	1,ANG1
	SOS	1,-3(P)
	HRRM	1,RLN1
	HRRM	1,RLN2
	SOS	1,-2(P)
	HRRM	1,XLC1
	HRRM	1,XLC2
	HRRM	1,XLC3
	HRRM	1,XLC4
	HRRM	1,XLC5
	HRRM	1,XLC6
	HRRM	1,XLC7
	SOS	1,-1(P)
	HRRM	1,YLC1
	HRRM	1,YLC2
	HRRM	1,YLC3
	HRRM	1,YLC4
	HRRM	1,YLC5
	HRRM	1,YLC6
	HRRM	1,YLC7
	SUB	P,[XWD 10,10]
	JRST	@10(P)
;	PLDIS

;	Finds the shortest squared distance, R, from point (X,Y) to
;	line I, and the corresponding coordinates, (XL,YL), on the
;	line. IW ← 1 (else 0) iff (XL,YL) is outside the line segment.
;	This routine is used in the insertion package. Assumes the
;	topological connectivity as reflected in the line-coordinates.

AK←0
IV←1
XC←2
YC←3
CYY←4
X←5
Y←6
I←7
XL←10
YL←11

PLDIS:	MOVE	X,-7(P)
	MOVE	Y,-6(P)
	MOVE	I,-5(P)
	SETZM	@-1(P)
	MOVEI	IV,(I)
	ASH	IV,1
	SUBI	IV,1
	MOVE	AK,[1000.0]
CYL4:	MOVE	CYY,.(I)
XLC6:	MOVE	XC,.(IV)
YLC6:	MOVE	YC,.(IV)
	JUMPE	CYY,.+3
CXL4:	MOVN	AK,.(I)			;IF CY≠0
	FDVR	AK,CYY			;THEN AK←-CXL[I]/CY
	MOVE	YL,AK
	FMPR	YL,Y
	FSBR	YL,XC
	FADR	YL,X
	FMPR	YL,AK
	FADR	YL,YC
	MOVE	13,AK
	FMPR	13,13
	FADR	13,[1.0]
	FDVR	YL,13			;YL←(YC+AK*(AK*Y-XC+X))/(1.0+AK↑2)
	MOVE	XL,Y
	FSBR	XL,YL
	FMPR	XL,AK
	FADR	XL,X			;XL ← X+AK*(Y-YL)
;	PLDIS CONT.

	MOVE	13,X
	FSBR	13,XL
	FMPR	13,13
	MOVE	14,Y
	FSBR	14,YL
	FMPR	14,14
	FADR	13,14
	MOVEM	13,@-2(P)	;R ← (X-XL)↑2+(Y-YL)↑2
	AOS	IV		;IV+1
	MOVMS	AK
	CAMLE	AK,[1.0]
	JRST	XLC7+2
	MOVE	13,XL
	FSBR	13,XC
	MOVE	14,XL
XLC7:	FSBR	14,.(IV)
	JRST	YLC7+1

	MOVE	13,YL
	FSBR	13,YC
	MOVE	14,YL
YLC7:	FSBR	14,.(IV)
	FMPR	13,14
	CAMGE	13,[-1.0]
	JRST	.+3
	MOVEI	13,1
	MOVEM	13,@-1(P)
	MOVEM	XL,@-4(P)
	MOVEM	YL,@-3(P)
	SUB	P,[XWD 10,10]
	JRST	@10(P)

END